home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / edump.arc / EDUMP.PAS < prev    next >
Pascal/Delphi Source File  |  1985-12-01  |  6KB  |  188 lines

  1.  
  2. PROGRAM Edump;
  3.  
  4. {
  5. EDUMP 1.0
  6. 11/30/85
  7.  
  8. EDUMP displays a HEX dump of a file.  In addition, an EYEreadable dump
  9. is also displayed.  An option of the program is display the file in
  10. either ASCII or EBCDIC.
  11.  
  12. To execute EDUMP enter EDUMP filename /switches There are 4 switches;
  13. /C/P/E/A. Either /C or /P may be enter to dump the file on the console
  14. or printer.
  15.  
  16. These 2 options are mutually exclusive. The /A option is
  17. the default and the file will be dumped in ASCII. If the /E option is
  18. chosen, the file will be dumped as though it were EBCDIC.
  19.  
  20. An include file has been used to define the translate table. There are 2
  21. arrays in the include file. They are named ETOA and ATOE for EBCDIC to
  22. ASCII and ASCII to EBCDIC respectively. In ETOA a corresponding ASCII
  23. character is chosen for each EBCDIC character where ever possible.
  24.  
  25. Since their are 256 valid EBCDIC codes, not every character has an
  26. approriate ASCII equivalent. The same is true for ATOE.  In addition,
  27. ATOE has 256 entries even through only 128 ASCII codes are defined.  The
  28. first 128 entries are duplicated. This essentially treats the last 128
  29. characters like the first 128, only the high order bit is set with
  30. parity.
  31.  
  32. The table was built using the IBM System/370 Reference Summary. IBM form
  33. number GX20-1850.  You are welcome to build your own table.  All that is
  34. needed it to alter XLATE.INC and recompile the program.
  35.  
  36. The program is written for the IBM PC in Turbo Pascal.  Version 3 of the
  37. compiler is needed recompile.
  38.  
  39. Daryl Coulthart
  40. 532 Lake Bayview Court
  41. Shoreview MN 55126
  42. (612) 483-1489
  43. }
  44.  
  45. CONST bufnumber = 32;
  46.       buflength =8191;
  47.  
  48.  
  49. {$I XLATE.INC}
  50. TYPE  STRING14=STRING[14];
  51. VAR   SOURCE,DESTINATION : FILE;
  52.       CH:CHAR;
  53.       outfile: TEXT;
  54.       FILENAME:STRING14;
  55.       BUFFER : ARRAY[0..buflength] of BYTE;
  56.       SCRNNO,i,K,L,bufno,NOOFRECSTOREAD,REMAINING:INTEGER;
  57.       mode   : CHAR;
  58.  
  59. FUNCTION EXIST(FILENAME:STRING14):BOOLEAN;
  60. VAR INFILE : FILE;
  61. BEGIN
  62.   ASSIGN(INFILE,FILENAME);
  63.   {$I-*}
  64.   RESET (INFILE);
  65.   { $I+*}
  66.   EXIST := (IORESULT=0);
  67. END;
  68.  
  69. PROCEDURE HEX(HB:BYTE; VAR LB,RB:CHAR);
  70. CONST CHS : ARRAY[0..15] OF CHAR
  71.       = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
  72. BEGIN
  73.   LB := CHS[HB DIV 16];
  74.   RB := CHS[HB MOD 16];
  75. END;
  76.  
  77. PROCEDURE displaybuffer;
  78. VAR T,I,J,N,M,OFFSET,LI:INTEGER;
  79.     LL,LR:BYTE;
  80.     LB,RB:CHAR;
  81. BEGIN
  82.     CLRSCR;
  83.     WRITELN(outfile,'Edump 1.0      ':15,'FILE NAME : ',FILENAME,
  84. '         PART : ', K+1+bufno*(bufnumber DIV 2), ' OF ',SCRNNO);
  85.     WRITELN(outfile);
  86.     if mode = 'E' then
  87.        WRITELN(outfile,'OFFSET',' ':24, 'HEXIDECIMAL',' ':24,'EBCDIC');
  88.     if mode = 'A' then
  89.        WRITELN(outfile,'OFFSET',' ':24, 'HEXIDECIMAL',' ':25,'ASCII');
  90.     WRITELN(outfile,'------ ',
  91.     ' -0--1--2--3--4--5--6--7--8--9--A--B--C--D--E--F   0123456789ABCDEF');
  92.     WRITELN(outfile);
  93.     FOR I := 0 TO 15 DO
  94.       BEGIN
  95.         L := L + 16;
  96.         LI := L DIV 256; LL := LI;
  97.         LR := L MOD 256;
  98.         OFFSET := bufno*256 + L;
  99.         HEX(LL,LB,RB);  WRITE(OUTFILE,' ',LB,RB);
  100.         HEX(LR,LB,RB);  WRITE(OUTFILE,LB,RB,'   ');
  101.         {HEX DUMP}
  102.         FOR J := 0 TO 15 DO
  103.           BEGIN
  104.             N := OFFSET + J;
  105.             HEX(ORD(BUFFER[N]),LB,RB); WRITE(OUTFILE,LB,RB,' ');
  106.           END;
  107.  
  108.         WRITE(outfile,'  ');
  109.         {ASCII / EBCDIC DUMP}
  110.         FOR J := 0 TO 15 DO
  111.           BEGIN
  112.             N := OFFSET + J;
  113.             T := ORD(BUFFER[N]);
  114.             if mode = 'E' then M := ETOA[T]
  115.                else M := T;
  116.             IF M > 127 THEN M := M - 128;
  117.             IF (M > 31) AND (M < 127) THEN
  118.                WRITE(outfile,chr(M))
  119.             ELSE
  120.               WRITE(outfile, '.'); {UNDISPLAYABLE CHARACTERS}
  121.           END;
  122.        WRITELN(outfile);
  123.        END;
  124.   END;
  125.  
  126. BEGIN
  127.   if ParamCount = 2 then
  128.      begin
  129.      FILENAME := PARAMSTR(1);
  130.      IF EXIST(FILENAME) THEN
  131.         BEGIN
  132.         ASSIGN(SOURCE,FILENAME);
  133.         RESET(SOURCE);
  134.         END
  135.      ELSE
  136.         BEGIN
  137.         WRITELN('INVALID FILE NAME, ENTER EDUMP WITH NO PARAMETERS FOR HELP.');
  138.         HALT;
  139.         END;
  140.  
  141.      IF POS('C',PARAMSTR(2)) > 0 THEN ASSIGN(OUTFILE,'CON:')
  142.         else IF POS('c',PARAMSTR(2)) > 0 THEN ASSIGN(OUTFILE,'CON:')
  143.         else IF POS('P',PARAMSTR(2)) > 0 THEN ASSIGN(OUTFILE,'LST:')
  144.         else IF POS('p',PARAMSTR(2)) > 0 THEN ASSIGN(OUTFILE,'LST:')
  145.         else ASSIGN(OUTFILE,'CON:');
  146.  
  147.      IF POS('a',PARAMSTR(2)) > 0 THEN MODE := 'A'
  148.         ELSE IF POS('A',PARAMSTR(2)) > 0 THEN MODE := 'A'
  149.         ELSE IF POS('E',PARAMSTR(2)) > 0 THEN MODE := 'E'
  150.         ELSE IF POS('e',PARAMSTR(2)) > 0 THEN MODE := 'E'
  151.         ELSE MODE := 'A';
  152.      END
  153.  
  154.    ELSE BEGIN
  155.       WRITELN('Usage, EDUMP FILENAME.EXT /C/P/A/E');
  156.       WRITELN(' ');
  157.       WRITELN('Where /C directs output to console.');
  158.       WRITELN('      /P directs output to printer.');
  159.       WRITELN('      /A indicates input file is to be interpreted as ASCII.');
  160.       WRITELN('      /E indicates input file is to be interpreted as EBCDIC.');
  161.       WRITELN('      /C & /P are mutually exclusive, and /A & /E are also.');
  162.       HALT;
  163.       END;
  164.  
  165. REMAINING := FILESIZE(SOURCE);
  166.   if odd(remaining) then SCRNNO := (REMAINING DIV 2) + 1
  167.   else SCRNNO := REMAINING DIV 2;
  168.   bufno := 0; l := 0 - 16;
  169.   WHILE REMAINING > 0 DO
  170.     BEGIN
  171.       IF bufnumber <= REMAINING THEN NOOFRECSTOREAD := bufnumber
  172.       ELSE NOOFRECSTOREAD := REMAINING;
  173.  
  174.       BLOCKREAD(SOURCE,BUFFER,NOOFRECSTOREAD);
  175.       FOR K := 0 TO ((NOOFRECSTOREAD-1) DIV 2) DO
  176.        BEGIN
  177.          displaybuffer;
  178.          WRITELN;
  179.          WRITE( ' ':6,'Press <ESC> to exit or return to continue.');
  180.          READ(KBD,CH);
  181.          IF ORD(CH)=27 THEN HALT;
  182.        END;
  183.        bufno := bufno + 1;
  184.        REMAINING := REMAINING - NOOFRECSTOREAD;
  185.      END;
  186.  END.
  187.  
  188.